/*
 * @Author: Creator
 * @Date: 2020-09-21 18:58:56
 * @LastEditors: Creator
 * @LastEditTime: 2020-09-22 15:25:23
 * @Description: 如果拥有错误，请通知我
 */
#include <stdio.h>
#include <malloc.h>
#include <stdbool.h>
// 为了方便使用 ， 采用双向链表
// 从文件中提取数据并组成链表的函数随后给出
// 结构体自行修改
typedef struct unname
{
    int data;
    struct unname * pre;
    struct unname * next;

} Node;                                                             // 链表 节点 Node
Node* List = NULL;                                                  // 链表头节点 List
Node* createNode(int data);                                         // 以数据data 创建 节点并返回节点地址
Node* findNode(Node* List,int data);                                // 以数据data 在 List 中 查找 Node 返回节点地址
bool isListEmpty(Node* List);                                       // 判断 List 是否为空，空（1），非空（0）
bool addNode(Node* List);                                           // 在链表 List 末尾增加节点
bool delNode(Node* List,int data);                                  // 以数据data 在 List 中 删除节点
bool insertNode(Node* List,int data,int p);                         // 以数据data 在 List 中 插入一个新节点，p（1） 在后插入，p（0）在前插入
bool cleanList(Node* List);                                         // 释放链表 List
int lenList(Node* List);                                            // 返回List长度
// 以上bool函数 成功 返回1，失败 返回0
// 其中insertNode 函数 修改为 插入已经构造好的节点，增加一个参数即可
// 注意 List 本身存储 信息，双向链表不必要使用 哨兵节点
bool isListEmpty(Node* List)
{
    if(List == NULL)
        return 1;
    else return 0;
}
int lenList(Node* List)
{
    int num = 0;
    Node* temp = List;
    while(temp)
    {
        num++;
        temp = temp->next;
    }
}
Node* createNode(int data)
{
    Node* temp = (Node*)malloc(sizeof(Node));
    temp->data = data;
    temp->pre = temp->next = NULL;
    return temp;
}
bool addNode(Node* List)
{
    Node* temp = List;
    Node* p = NULL;
    int data = 0;
    if(isListEmpty(List))
    {
        printf("ERROR:List hasn't been created！\n");
        return 0;
    }
    while(temp->next)
        temp = temp->next;
    printf("please input data:");
    scanf("%d",&data);
    p = createNode(data);
    temp->next = p;
    p->pre = temp;
    return 1;
}
Node* findNode(Node* List,int data)
{
    Node* temp = List;
    if(isListEmpty(List))
    {
        printf("ERROR:List hasn't been created！\n");
        return 0;
    }
    while(temp && temp->data != data)
        temp = temp->next;
    if(temp)
        return temp;
    else
    {
        printf("ERROR:There is no Node with that data in this List\n");
        return 0;
    }
}
bool delNode(Node* List,int data)
{
    Node* temp = findNode(List,data);
    if(temp)
    {
        if(temp->next)
        {
            temp->pre->next = temp->next;
            temp->next->pre = temp->pre;
        }
        else
        {
            temp->pre->next = NULL;
        }
        free(temp);
        return 1;
    }
    else
    {
        printf("ERROR:No node like this OR No List!");
        return 0;
    }
    
}
bool insertNode(Node* List,int data,int p)
{
    Node* temp = findNode(List,data);
    if(temp)
    {
        Node* new = createNode(data);
        if(p)
        {
            if(!temp->next)
            {
                new->next = temp->next;
                new->next->pre = new;
            }
            new->pre = temp;
            temp->next = new;
        }
        else
        {
            if(!temp->pre)
            {
                temp->pre->next = new;
                new->pre = temp->pre;
            }
            new->next = temp;
            temp->pre = new;
        }
        return 1;
    }
    else
    {
        printf("ERROR:No node like this OR No List!");
        return 0;
    }
    
}

bool cleanList(Node* List)
{
    if(isListEmpty(List))
    {
        printf("ERROR:The List is empty!\n");
        return 0;
    }
    Node* temp = List;
    while(temp->next)
    {
        free(List);
        temp = temp->next;
        List = temp;
    }
    free(List);
    return 1;
}

int main(void)
{
    Node* List = createNode(0);
    addNode(List);
    addNode(List);
    printf("%d",findNode(List,2)->data);
    return 0;
}